package com.hnit.utils;


import com.hnit.web.Utils.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/*
 * 全局异常处理器
 * -----------------------------------------------
 * 请求成功（带数据）			200
 * 新增资源成功				201
 * 删除资源成功（无数据）		204
 * 无需更新					205
 * -----------------------------------------------
 * 参数错误					400
 * 未登录					    401
 * 无权限					    403
 * 资源不存在				    404
 * 日期格式错误				405
 * -----------------------------------------------
 * 服务器代码异常				500
 * 服务暂时不可用				503
 * -----------------------------------------------
 * */
@Slf4j
@RestControllerAdvice(basePackages = {"com.hnit.controller"})
public class GlobalExceptionHandler {
    /**
     * 处理时钟回拨异常（Snowflake ID生成器特有）
     */
    @ExceptionHandler(IllegalStateException.class)
    public ResponseEntity<ResponseResult> handleIllegalStateException(IllegalStateException e) {
        // 识别Snowflake时钟回拨异常（通过消息特征匹配）
        if (e.getMessage() != null && e.getMessage().contains("Clock moved backwards")) {
            log.error("Snowflake ID生成失败：系统时钟回拨", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(ResponseResult.builder()
                    .code(0)  // 自定义错误码（如500表示系统异常）
                    .data("ID生成失败：系统时钟发生回拨，请检查服务器时间同步状态")  // 用户友好提示
                    .build());
        }

        // 处理其他类型的IllegalStateException
        log.error("非法状态异常", e);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)  // HTTP 400状态码
                .body(ResponseResult.builder()
                        .code(0)  // 业务错误码
                        .data("操作异常: " + e.getMessage())
                        .build());
    }

    /**
     * 处理其他异常  Exception是所有异常的父类，所以要放到最后
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ResponseResult> handleException(Exception e) {
        log.error("系统异常", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)  // HTTP 500状态码  服务器内部错
                .body(ResponseResult.builder()
                        .code(0)  // 业务错误码
                        .data("系统异常: " + e.getMessage())
                        .build());
    }
}
